﻿// using System.Collections.Concurrent;
// using System.Threading;
// using System.Threading.Tasks;
//
// namespace Hsenl {
//     public class Example_HTaskLine {
//         public static void Start() {
//             Test();
//         }
//
//         private static void Test() {
//             // 这种用法是保证即便在多线程里, 也能保证多线程代码会一个接一个的执行, 而不会并行执行, 但这些代码依然运行在多线程里.
//             // 适用于: 比如耗费计算的操作, 不想占用主线程的算力, 又不想写多线程代码, 就可以用这种并行多线程的方式.
//             // 调用Wait的时候, 也可以在多线程中调用, 一样会并行执行, 只是先后顺序就不确定了.
//             //
//             // 如果就想要无论何时, 都严格按照顺序执行, 我们可以给 taskline 设置一个参数
//             // taskLine.SetConfig(new HTaskLine.LineConfig() { fixedLowestPosition = 0 });
//             // 这句代码给line设置了一个固定的最低值, 也就是说, 无论谁先谁后, 只要 position 大于 fixedLowestPosition, 都会被 wait, 只有当 position <= 该值的时候, 才会放行
//             // 这样, 无论调用时候的顺序是什么, 执行的时候, 都会严格的按照0-6的顺序执行, 你最低的 position 是多少, fixedLowestPosition 设置为多少就行
//             //
//             // 默认情况下, taskline的最低位是灵活变动的, 也就是说, 假如0 1 2没有处于wait或执行状态, 那么当 3 wait 的时候, 并不会受到阻拦
//
//             HTaskLine taskLine = new();
//             Run(taskLine, 3).Tail();
//             Run(taskLine, 3).Tail();
//             Run(taskLine, 0).Tail();
//             Run(taskLine, 2).Tail();
//             Run(taskLine, 1).Tail();
//             Run(taskLine, 1).Tail();
//             Run(taskLine, 6).Tail();
//             Run(taskLine, 4).Tail();
//             Run(taskLine, 5).Tail();
//             Run(taskLine, 5).Tail();
//
//             // 假如我们不需要严格按顺序执行, 谁前谁后都无所谓, 我们只需要并行执行就行了, 那我们可以把所有的 position 都设置成同一个值, 像下面这样, 这么做的好处是, 可以稍微提高一点
//             // 速度, 因为 taskline 在 notify 的时候, 会从当前 position 向最大的 position, 依次遍历, 直到找到 处于 wait 的 position, 都设置为同一个position, 可以让
//             // 这个遍历, 始终只会执行一次. 但要注意, 这么做的话, waitSelf要为true, cover要为false
//             // Run(taskLine, 0).Tail();
//             // Run(taskLine, 0).Tail();
//             // Run(taskLine, 0).Tail();
//             // Run(taskLine, 0).Tail();
//             // Run(taskLine, 0).Tail();
//
//             // 下面是展示, 在多线程里 wait, 也要保证按顺序执行的用法, 关键就在于要设置固定最低位置, 且要注意该值不能低于你所有的 position, 那会导致所有的 position 都永远处于 wait
//             // taskLine.SetConfig(new HTaskLine.LineConfig() { fixedLowestPosition = 0 });
//             // ConcurrentQueue<int> queue = new();
//             // queue.Enqueue(3);
//             // queue.Enqueue(2);
//             // queue.Enqueue(0);
//             // queue.Enqueue(1);
//             // queue.Enqueue(4);
//             // queue.Enqueue(5);
//             // Parallel.For(0, 6, _ => {
//             //     queue.TryDequeue(out var position);
//             //     Run(taskLine, position).Tail();
//             // });
//         }
//
//         private static async HVoid Run(HTaskLine taskLine, int position, bool waitSelf = true, bool cover = false, bool clearHigh = false) {
//             using (await taskLine.Wait(position, waitSelf, cover, clearHigh)) {
//                 await HTask.Run(() => { Log.Debug(position); });
//             }
//
//             var cts = new CancellationTokenSource();
//             var cancel = cts.Token;
//             await Task.Delay(1000, cancel);
//             cts.Cancel();
//         }
//     }
// }